export class XyTools {
    constructor() {}

    FD(date, format = 0, symbol_date = '-', symbol_time = ':', type = 24) {
        /**
         * FormatDate 格式化日期
         * @autor xy           
         * @param date         格式化的时间
         * @param type         返回的格式 0: 日期 + 时间  1: 日期  2: 时间
         * @param symbol_date  分割年月日的符号
         * @param symbol_time  分割时分秒的符号
         * @param type         12小时 或者 24小时
         */
        var D = new Date(date);
        type = parseInt(type) == 12 ? 12 : 24;

        var y = D.getFullYear();
        var m = (D.getMonth() + 1).toString().padStart(2, '0'); // 	不及2位的用0补齐
        var d = D.getDate().toString().padStart(2, '0');
        var noon; //! 记录上午 下午

        if (type == 12) {
            var arr = D.toLocaleTimeString('chinese', {
                hour12: true
            }).split('');

            noon = arr[0] + arr[1];
            arr.splice(0, 2);
            arr = arr.join('').split(':');

            var h = arr[0];
            var min = arr[1];
            var s = arr[2];
        } else {
            var h = D.getHours().toString().padStart(2, '0');
            var min = D.getMinutes().toString().padStart(2, '0');
            var s = D.getSeconds().toString().padStart(2, '0');
        }

        if (symbol_date && symbol_time) { //! 以符号拼接
            if (format == 0) {
                return [y, m, d].join(symbol_date.toString()) + ' ' + [h, min, s].join(symbol_time) + (type == 12 ? (' ' + noon) : '');
            } else if (format == 1) {
                return [y, m, d].join(symbol_date.toString());
            } else {
                return [h, min, s].join(symbol_time) + (type == 12 ? (' ' + noon) : '');;
            }
        } else if (symbol_date && !symbol_time) {
            if (format == 0) {
                return [y, m, d].join(symbol_date.toString()) + ' ' + h + '时' + min + '分' + s + '秒' + (type == 12 ? (' ' + noon) : '');
            } else if (format == 1) {
                return [y, m, d].join(symbol_date.toString());
            } else {
                return h + '时' + min + '分' + s + '秒' + (type == 12 ? (' ' + noon) : '');
            }
        } else if (!symbol_date && symbol_time) {
            if (format == 0) {
                return y + '年' + m + '月' + d + '日' + ' ' + [h, min, s].join(symbol_time) + (type == 12 ? (' ' + noon) : '');
            } else if (format == 1) {
                return y + '年' + m + '月' + d + '日';
            } else {
                return [h, min, s].join(symbol_time) + (type == 12 ? (' ' + noon) : '');
            }
        } else {
            if (format == 0) {
                return y + '年' + m + '月' + d + '日' + ' ' + h + '时' + min + '分' + s + '秒' + (type == 12 ? (' ' + noon) : '');
            } else if (format == 1) {
                return y + '年' + m + '月' + d + '日';
            } else {
                return h + '时' + min + '分' + s + '秒' + (type == 12 ? (' ' + noon) : '');
            }
        }
    }

    CS(date) {
        /**
         * CNDateString 将日期转化为大写
         * @autor xy   
         * @param date 需要转化的时间
         */
        var cn = ["〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
        var s = [];
        var YY = date.getFullYear().toString();
        for (var i = 0; i < YY.length; i++)
            if (cn[YY.charAt(i)])
                s.push(cn[YY.charAt(i)]);
            else
                s.push(YY.charAt(i));
        s.push("年");
        var MM = date.getMonth() + 1;
        if (MM < 10)
            s.push(cn[MM]);
        else if (MM < 20)
            s.push("十" + cn[MM % 10]);
        s.push("月");
        var DD = date.getDate();
        if (DD < 10)
            s.push(cn[DD]);
        else if (DD < 20)
            s.push("十" + cn[DD % 10]);
        else
            s.push("二十" + cn[DD % 10]);
        s.push("日");
        return s.join('');
    }

    set(key, data) {
        /**
         * 设置 LocalStorage sessionStorage
         * @autor xy   
         * @param key 键值
         * @param data 保存的数据
         */
        try {
            const result = JSON.stringify(data)

            wx.setStorageSync({
                key: key,
                data: result
            });
        } catch (error) {
            wx.setStorageSync({
                key: key,
                data
            });
        }
    }

    get(key) {
        /**
         * 获取 LocalStorage sessionStorage
         * @autor xy   
         * @param key 键值
         */

        let data;

        data = wx.getStorageSync(key)

        try {
            const result = JSON.parse(data)
            return result
        } catch (error) {
            return data
        }
    }

    remove(key) {
        /**
         * 移除 LocalStorage sessionStorage
         * @autor xy   
         * @param key 键值
         */
        try {
            wx.removeStorageSync(key);
            return true
        } catch (error) {
            return false
        }
    }

    // 将base64转换为文件对象
    DUF(dataurl, filename, type = 'file') {
        /**
         * dataURLtoFile
         * @autor xy       
         * @param dataurl  base64字符串
         * @param filename 文件名
         * @param type     文件类型  
         */
        var arr = dataurl.split(',');
        var mime = arr[0].match(/:(.*?);/)[1];
        var bstr = atob(arr[1]);
        var n = bstr.length
        var u8arr = new Uint8Array(n);
        while (n--) {
            u8arr[n] = bstr.charCodeAt(n);
        }

        if (type == 'blob') {
            //! 转换成成blob对象
            return new Blob([u8arr], {
                type: mime
            });
        } else {
            //! 转换成file对象
            return new File([u8arr], filename, {
                type: mime
            });
        }
    }

    RI(length = 3) {
        /**
         * randomId 随机的ID生成器
         * @autor xy      
         * @param length  随机数长度
         */
        let ID = Number(Math.random().toString().substr(3, length) + Date.now()).toString(36);
        ID = ID.split('');
        ID.map((item, index) => {
            let flag = Math.random().toString().substr(3, 1) % 2;

            if (flag) {
                //! 随机转化为大写
                ID[index] = item.toUpperCase();
            }
        });

        return ID.join('');
    }

    ZI(file, maxSize, quality) {
        /**
         * zipImg 图片压缩
         * @autor xy      
         * @param file    需要压缩的文件
         * @param maxSize 超过多少大小进行压缩
         * @param quality 压缩质量
         */
        if (file.file.size > parseInt(maxSize)) {
            //! 创建Canvas对象(画布)
            var canvas = document.createElement('canvas');
            //! 获取对应的CanvasRenderingContext2D对象(画笔)
            var context = canvas.getContext('2d');
            //! 创建新的图片对象
            var img = new Image();
            //! 指定图片的DataURL(图片的base64编码数据)
            img.src = file.content;

            img.onload = () => {
                //! 监听浏览器加载图片完成，然后进行进行绘制
                //! 指定canvas画布大小，该大小为最后生成图片的大小
                if (file.file.name.split('.')[1] == 'png') {
                    canvas.width = 1600;
                    canvas.height = 900;
                } else {
                    canvas.width = 2560;
                    canvas.height = 1440;
                }

                /* drawImage画布绘制的方法。(0,0)表示以Canvas画布左上角为起点，400，300是将图片按给定的像素进行缩小。
                      如果不指定缩小的像素图片将以图片原始大小进行绘制，图片像素如果大于画布将会从左上角开始按画布大小部分绘制图片，最后的图片就是张局部图。*/
                context.drawImage(img, 0, 0, canvas.width, canvas.height);
                //! 将绘制完成的图片重新转化为base64编码，file.file.type为图片类型，0.92为默认压缩质量
                var base_img = canvas.toDataURL(file.file.type, quality);

                var blodBin = atob(base_img.split(',')[1]);
                var data = [];
                for (var i = 0; i < blodBin.length; i++) {
                    data.push(blodBin.charCodeAt(i));
                }
                var blob1 = new Blob([new Uint8Array(data)], {
                    type: 'image/png'
                });
                var file1 = new File([blob1], new Date().getTime() + '.png');

                return file1;
            };
        }
    }

    DC(obj) {
        /**
         * 深度克隆
         * @autor xy      
         * @param obj    需要压缩的文件
         */
        var objClone = Array.isArray(obj) ? [] : {};
        if (obj && typeof obj === "object") {
            for (key in obj) {
                if (obj.hasOwnProperty(key)) {
                    if (obj[key] && typeof obj[key] === "object") {
                        objClone[key] = this.DC(obj[key]);
                    } else {
                        objClone[key] = obj[key];
                    }
                }
            }
        }
        return objClone;
    }

    DB(fn, delay) {
        /**
         * debounce 防抖
         * @param fn 函数名 
         * @param delay 延时
         */
        let t = null
        return function () {
            if (t !== null) {
                clearTimeout(t)
            }
            t = setTimeout(() => {
                fn.call(this)
            }, delay)
        }
    }

    TT(fn, delay) {
        /**
         * throttle 节流
         * @param fn 函数名 
         * @param delay 延时
         */

        let flag = true;
        return function () {
            if (flag) {
                setTimeout(() => {
                    fn.call(this)
                    flag = true
                }, delay)
            }
            flag = false
        }
    }

    PE(e) {
        /**
         * pauseEvent 清除默认事件 事件冒泡
         * @autor xy 
         * @param e  事件对象
         */
        e = e || window.event;

        if (e.stopPropagation) e.stopPropagation(); //!清除冒泡

        if (e.preventDefault) e.preventDefault(); //! 移除默认事件

        e.cancelBubble = true; //! 兼容火狐的冒泡

        e.returnValue = false;

        return false;
    }

    IS(val) {
        /**
         * isNullString 去空格
         * @autor xy            
         * @param val  目标字符串
         */
        return (val == '' || val.trim() == '');
    }
}